/**
 * 泛型即泛类型，也就是类型并不需要在声明时决定，
 * 而是延迟到使用时候决定
 * 
 * 泛类型和普通类的区别就是类名之后有类型参数声明，
 * 声明类型参数可以有一个或多个，多个参数间用逗号隔开
 * 一个泛型参数，也被称为一个类型变量，它是用于指定一个泛型类型名称的标识符，
 * 一般E，T，或K等字母表示。
 * 类名中声明参数类型后，内部成员，方法就可以使用声明后的参数类型。
 */
void main(List<String> args) {
  // List list = List();
  // list.add('ni xiao niu');
  // list.add(3.5);
  // list.add(2);
  // list.add(Person('张三'));
  
  List list= ['ni xiao niu', 3.5 , 2 , Person('张三')]; 
  //list列表中的成员类型并没有直接指定，给它任何类型的数据
  print(list);
  //List<E> element
  // var nameLists = <String>[]; //指定List中只能放入String类型的数据
  // nameLists.add('张三');
  // nameLists.add(Person('李四').toString());
  Info<int> info1 = Info(10);
  info1.printInfo();

  Info<String> info2 = Info('张三');
  info2.printInfo();

  Info<Person> info3 = Info(Person('李四'));
  info3.printInfo();

  //用户角色
  //系统管理员
  //注册用户
  //一般用户
  //来宾用户
  Info<Admin> infoAdmin = Info(Admin('ni hao'));
  infoAdmin.printInfo();
  Info<Login> infoLogin = Info(Login('ni hao'));
  infoLogin.printInfo();
  Info<User> infoUser = Info(User('ni hao'));
  infoUser.printInfo();
  Info<Guest> infoGuest = Info(Guest('ni hao'));
  infoGuest.printInfo();
}
class Person {
  String name= 'ask';
  Person(this.name);
}
class Admin extends Person {
  Admin(name):super(name);
}
class Login extends Person {
  Login(name):super(name);
}
class User extends Person {
  User(name):super(name);
}
class Guest extends Person {
  Guest(name):super(name);
}
class Info<T> {
  T value;
  Info(this.value);
  void printInfo(){
    print('$value is $T');
  }
}